package SQLite3;

import java.util.Vector;

/**
 * Class representing an SQLite result set as returned by the <A
 * HREF="Database.html#get_table(java.lang.String)">Database.get_table</A>
 * convenience method. <BR>
 * <BR>
 * Example:<BR>
 * 
 * <PRE>
 *   ...
 *   SQLite.Database db = new SQLite.Database();
 *   db.open("db", 0);
 *   System.out.print(db.get_table("select * from TEST"));
 *   ...
 * </PRE>
 * 
 * Example output:<BR>
 * 
 * <PRE>
 *   id|firstname|lastname|
 *   0|John|Doe|
 *   1|Speedy|Gonzales|
 *   ...
 * </PRE>
 */

public class TableResult implements Callback {

	/**
	 * Number of columns in the result set.
	 */

	public int ncolumns;

	/**
	 * Number of rows in the result set.
	 */

	public int nrows;

	/**
	 * Column names of the result set.
	 */

	public String column[];

	/**
	 * Types of columns of the result set or null.
	 */

	public String types[];

	/**
	 * Rows of the result set. Each row is stored as a String array.
	 */

	public Vector<String[]> rows;

	/**
	 * Maximum number of rows to hold in the table.
	 */

	public int maxrows = 0;

	/**
	 * Flag to indicate Maximum number of rows condition.
	 */

	public boolean atmaxrows;

	/**
	 * Create an empty result set.
	 */

	public TableResult() {
		clear();
	}

	/**
	 * Create an empty result set with maximum number of rows.
	 */

	public TableResult(int maxrows) {
		this.maxrows = maxrows;
		clear();
	}

	/**
	 * Clear result set.
	 */

	public void clear() {
		column = new String[0];
		types = null;
		rows = new Vector<String[]>();
		ncolumns = nrows = 0;
		atmaxrows = false;
	}

	/**
	 * Callback method used while the query is executed.
	 */

	public void columns(String coldata[]) {
		column = coldata;
		ncolumns = column.length;
	}

	/**
	 * Callback method used while the query is executed.
	 */

	public void types(String types[]) {
		this.types = types;
	}

	/**
	 * Callback method used while the query is executed.
	 */

	public boolean newrow(String rowdata[]) {
		if (rowdata != null) {
			if (maxrows > 0 && nrows >= maxrows) {
				atmaxrows = true;
				return true;
			}
			rows.addElement(rowdata);
			nrows++;
		}
		return false;
	}

	/**
	 * Make String representation of result set.
	 */

	public String toString() {
		StringBuffer sb = new StringBuffer();
		int i;
		for (i = 0; i < ncolumns; i++) {
			sb.append(column[i] == null ? "NULL" : column[i]);
			sb.append('|');
		}
		sb.append('\n');
		for (i = 0; i < nrows; i++) {
			int k;
			String row[] = (String[]) rows.elementAt(i);
			for (k = 0; k < ncolumns; k++) {
				sb.append(row[k] == null ? "NULL" : row[k]);
				sb.append('|');
			}
			sb.append('\n');
		}
		return sb.toString();
	}
}
